// 迭代器设计模式：

// 场景：协同开发一个任务清单应用

// 普遍模式：
/**********A任务代码*************/
// const todos = {
//     life: ['吃饭', '睡觉', '打游戏'],
//     learn: ['数学', '英语', '中文'],
//     work: ['donging...']
// }



// /************B任务代码***********/
// // 需要根据A代码的数据结构，调整代码逻辑
// for (let i of todos.life) {
//     console.log(i);
// }
// for (let i of todos.learn) {
//     console.log(i);
// }
// for (let i of todos.work) {
//     console.log(i);
// }


// // 迭代器模式：
// /**********A任务代码*************/
// const todos = {
//     life: ['吃饭', '睡觉', '打游戏'],
//     learn: ['数学', '英语', '中文'],
//     work: ['donging...'],
//     eachFn: function(callBack) {
//         // const arr = [].concat(this.life, this.learn, this.work)
//         const arr = [...this.life, ...this.learn, ...this.work]
//         for (let i of arr) {
//             callBack(i)
//         }
//     }
// }

// /************B任务代码***********/
// // 需要根据A代码的数据结构，调整代码逻辑
// // 通过A暴露的方法（API）获取数组的相对数据,不用再去分情况筛选调用
// todos.eachFn(item => console.log(item))


// 迭代器+迭代器模式：
/**********A任务代码*************/
const todos = {
    life: ['吃饭', '睡觉', '打游戏'],
    learn: ['数学', '英语', '中文'],
    work: ['donging...'],
    eachFn: function(callBack) {
        // const arr = [].concat(this.life, this.learn, this.work)
        const arr = [...this.life, ...this.learn, ...this.work]
        for (let i of arr) {
            callBack(i)
        }
    },
    [Symbol.iterator]: function() {
        const arr = [...this.life, ...this.learn, ...this.work];
        let index = 0;
        return {
            next: function() {
                return {
                    value: arr[index],
                    done: index++ >= arr.length
                }
            }
        }
    }
}

/************B任务代码***********/
// 需要根据A代码的数据结构，调整代码逻辑
// 通过A暴露的方法（API）获取数组的相对数据,不用再去分情况筛选调用
// m模拟迭代器
// todos.eachFn(item => console.log(item))
// 迭代器
for (let i of todos) {
    console.log(i);
}